from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import redis
from flask_cors import CORS
from toutiao.settings import Config, config_dict, setup_log

app = Flask(__name__)

# 需要修改 字典的key 就可以获取到指定的不同配置类
Config = config_dict['dev']

# 设置日志
setup_log(Config)

# 加载配置类
app.config.from_object(Config)

# 创建 SQLAlchemy 实例
db = SQLAlchemy(app)

# 创建一个redis实例
# current_app 是app的代理   current_app.redis_store    current_app 利于 我们抽取代码
# 有些时候我们可以通过 current_app.属性 来获取 app.属性 的信息
app.redis_store = redis.Redis(host=Config.REDIS_HOST, port=Config.REDIS_PORT)

# 设置跨域请求
CORS(app)

# 雪花算法来生成id,
# 雪花算法生成的id 能够确保唯一
from snowflake.id_worker import IdWorker

app.id_worker = IdWorker(datacenter_id=Config.DATACENTER_ID,
                         worker_id=Config.WORKER_ID,
                         sequence=Config.SEQUENCE)

# 蓝图注册
from toutiao.apps.home.views import home_blue

app.register_blueprint(home_blue)

from toutiao.apps.user import user_blue

app.register_blueprint(user_blue)


from flask import request, g
from auth.auth_jwt import verify_token

# 设置每次请求前判断token和获取全局user_id
@app.before_request
def before_request():
    # 初始化全局临时变量g
    g.user_id = None
    g.is_refresh_token = None
    # 在每次请求前 ，我们都判断一下 请求头中 是否存在 token信息
    auth = request.headers.get('Authorization')
    # 请求头中有信息，并且数据是以 Bearer  为前缀
    if auth and auth.startswith('Bearer '):
        # Bearer后面有个空格然后才是token码 xxxx.xxxx.xxx
        # 我们要获取token ,这里是剪切的前7个,留下后面的token码
        token = auth[7:]
        # 验证token
        payload = verify_token(token)
        if payload:
            g.user_id = payload.get('user_id')
            g.is_refresh_token = payload.get('refresh')
